package org.szy.core.common.service;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.mybatisflex.core.update.UpdateWrapper;
import com.mybatisflex.core.util.UpdateEntity;

import java.io.Serializable;
import java.util.List;

/**
 * 继承由 Mybatis-Flex 提供的顶级增强 Service 接口。
 * 增加一些自定义操作
 *
 * @author 孙志阳
 * @date 2023-06-16
 * @since 1.0.0
 **/
public interface BaseService<T> extends IService<T> {

    default T getById(Serializable id, String... columns) {
        QueryWrapper qw = new QueryWrapper();
        if (ArrayUtil.isEmpty(columns)) {
            qw.select(columns);
        } else {
            qw.select(String.join(",", columns));
        }
        qw.and(new QueryColumn("id").eq(id));
        return this.getOne(qw);
    }

    String createNewPids(Serializable pid);

    /**
     * 根据键值对获取实体对象
     *
     * @param column 列名
     * @param value  数据
     * @return 实体对象
     */
    default T getOneByKAV(String column, Object value) {
        QueryWrapper qw = new QueryWrapper();
        qw.and(new QueryColumn(column).eq(value));
        return getOne(qw);
    }

    /**
     * 根据键值对获取实体对象
     *
     * @param column  列名
     * @param value   数据
     * @param columns 查询字段名
     * @return 实体对象
     */
    default T getOneByKAV(String column, Object value, String... columns) {
        QueryWrapper qw = new QueryWrapper();
        if (ArrayUtil.isEmpty(columns)) {
            qw.select(columns);
        } else {
            qw.select(String.join(",", columns));
        }
        qw.and(new QueryColumn(column).eq(value));
        return getOne(qw);
    }


    /**
     * 根据键值对获取实体对象集合
     *
     * @param column 列名
     * @param value  数据
     * @return 实体对象集合
     */
    default List<T> listByKAV(String column, String value) {
        QueryWrapper qw = new QueryWrapper();
        qw.and(new QueryColumn(column).eq(value));
        return list(qw);
    }

    default List<T> listByKAV(String column, String value, String... columns) {
        QueryWrapper qw = new QueryWrapper();
        if (ArrayUtil.isEmpty(columns)) {
            qw.select(columns);
        } else {
            qw.select(String.join(",", columns));
        }
        qw.and(new QueryColumn(column).eq(value));
        return list(qw);
    }


}
